﻿#ifndef HAVCLIENTPROTOCOL_H
#define HAVCLIENTPROTOCOL_H

#include <string>
#include <vector>

#define _WINSOCKAPI_
#include <windows.h>

#pragma once

#define AVC_ERR_NO 0
#define AVC_ERR_LOGIN 1
#define AVC_ERR_LOGIN_GETDIR 2
#define AVC_ERR_LOGIN_PARAM 3
#define AVC_ERR_LOGIN_USER_PWSD 4
#define AVC_ERR_LOGOUT 50

#define AVC_ERR_PLAY 100
#define AVC_ERR_PLAY_CREATE_PLAYER 101
#define AVC_ERR_PLAY_CREATE_COMMUNICATION 102
#define AVC_ERR_PLAY_DECODE_INIT_FAIL 103
#define AVC_ERR_PLAY_CONNECT_SERVER 104
#define AVC_ERR_PLAY_STOP 150

#define AVC_ERR_BROADCAST 200
#define AVC_ERR_BROADCAST_ALREADY_START 201
#define AVC_ERR_BROADCAST_STOP 260
#define AVC_ERR_BROADCAST_ALREADY_STOP 261

#define AVC_ERR_PTZCONTROL 300

/**
 * DataStructType 
 * 数据结构类型，每一种类型对应一种存储返回结果的数据结构
 * ETYPE_BASE_RESULT指定的数据结构为BaseResult
 * ETYPE_LOGIN_RESULT指定的数据结构为LoginResult
 * ETYPE_BROADCAST_RESULT指定的数据结构为BroadcastResult
 */
enum DataStructType
{
	ETYPE_NONE = 0,
	ETYPE_BASE_RESULT,
	ETYPE_LOGIN_RESULT,
	ETYPE_BROADCAST_RESULT,
	ETYPE_EXTRA_RESULT,
	ETYPE_NVRChannle_RESULT,
	ETYPE_EventMessage_RESULT
};

enum DRAWTYPE
{
	DRAWTYPE_MAIN = 1,    //只绘制主区域
	DRAWTYPE_ALARM,       //只绘制告警区域
	DRAWTYPE_MAIN_ALARM,  //同时绘制主区域和告警区域
};

enum MAINDRAWSTATE
{
	MAINDRAWSTATE_DRAWING = 1, //正在绘制主区域
	MAINDRAWSTATE_PAUSE,       //暂停绘制主区域
};

/**
 * PTZType 
 * 控制类型
 */
enum PTZType
{
	CONTROL_ZOOMIN = 11,		//焦距以速度SS变大(倍率变大)
	CONTROL_ZOOMOUT = 12,		//焦距以速度SS变小(倍率变小)
	CONTROL_FOCUSNEAR = 13,		//焦点以速度SS前调
	CONTROL_FOCUSFAR = 14,		//焦点以速度SS后调
	CONTROL_IRISENLARGE = 15,	//光圈以速度SS扩大	
	CONTROL_IRISSHRINK = 16,	//光圈以速度SS缩小

	CONTROL_TOP_MIDDLE = 21,	//云台以SS的速度上仰
	CONTROL_BOTTOM_MIDDLE = 22,	//云台以SS的速度下俯
	CONTROL_MID_LEFT = 23,		//云台以SS的速度左转
	CONTROL_MID_RIGHT = 24,		//云台以SS的速度右转
	CONTROL_TOP_RIGHT = 25,		//云台以SS的速度右上仰
	CONTROL_BOTTOM_RIGHT = 26,	//云台以SS的速度右下仰
	CONTROL_TOP_LEFT = 27,		//云台以SS的速度左上仰
	CONTROL_BOTTOM_LEFT = 28,	//云台以SS的速度左下仰
	CONTROL_MID_MIDDLE = 29,	//云台以SS的速度左右自动扫描

};

/**
 * DeviceGroupItem 
 * 数据结构设备组
 *id 为该组id号
 *masterId 为数据以树的形式组织时，该数据是根节点还是叶子节点，若值为0为根节点，否则为叶子节点
 *name 该设备组的名称
 */
struct DeviceGroupItem{
	int id;
	int masterId;
	std::string name;
};

/**
 * UserDeviceItem 
 * 数据结构用户设备
 *id 为该设备id号
 *groupId 为所属设备组的id
 *name 该设备的名称
 */
struct UserDeviceItem{
	int id;
	int groupId;
	std::string name;
	std::string type;
	std::string IP;
	std::string rtspurl;
	bool isOnline;
	int StreamType;//1:只有子码流 2:只有主码流 3:双码流
	std::string token;
};

/**
 * AVRelationItem 
 * 数据结构音视频设备对应关系
 *videoDeviceId 为视频设备id号
 *lstAudioDeviceId 为音频设备id列表
 */
struct AVRelationItem{
	int videoDeviceId;
	std::vector<int> lstAudioDeviceId;
};

struct BaseResult {
	int result; //返回的结果值，若为0表示成功；否则失败
	int deviceid; //设备id
};

struct LoginResult {
	int result; //返回的结果值，若为0表示成功；否则失败
	int clientID; 
	std::vector<DeviceGroupItem> deviceGroup;
	std::vector<UserDeviceItem> userDevice;
	std::vector<AVRelationItem> avRelation;
};

struct BroadcastResult{
	int result; //返回的结果值，若为0表示成功；否则失败
	int taskId; 
};

struct ExtraResult{
	int deviceID; //设备的ID
	std::string extraType; // extraType: "FrameSize"
	std::string extraValue; //extraValue: "width:xxxx:height:xxxx"
};

/**
 * @param eType 操作类型可参见OperatorType，调用者通过该值判断pResultData数据结构的类型，
 *				通过类型强转获得对应数据结构的数据。
 * @param pResultData 调用者需注册一个FPRESULT类型函数作为回调函数
 * @param pThis 调用者的this指针
 */
typedef void (*FPRESULT)(DataStructType eType,void *pResultData, void *pThis);

#endif 
